package com.doubleview.demo

/**
 * @author huchengchao@kuaishou.com
 * Created on 2021-11-20
 */
//==================动态闭包-动态判断入参列表长度=============================
// Groovy 可以在程序运行时动态地判断传入闭包的参数列表长度
def tax(Double amount, Closure computer) {
    switch (computer.maximumNumberOfParameters) {
        case 1: return computer(amount)
        case 2: return computer(amount, 15)
        default: throw new Exception("need 1 or 2 args.")
    }
}


// 这个闭包传入了税率计算方式以及税率，只需要 1 个参数
println tax(14000.0) {
    amount -> amount * 0.13
}

// 这个闭包不主动传入税率 rage，有 2 个参数
println tax(14000.0) {
    amount, rage -> amount * (rage / 100)
}


//==================动态闭包-动态判断参数实际类型============================
//可以使用 parameterTypes 属性来动态获取参数的实际类型
def check(Closure cls) {
    int i = 1
    for (args in cls.parameterTypes) {
        println "type[${i}] = ${args.typeName}"; i++
    }
    //.. 什么也不做
}

// type[1] = java.lang.String
check {
    String i -> //.. 什么都不做
}

// type[1] = java.lang,Integer
check {
    Integer i -> //.. 还是什么也不做
}

//type[1] = java.lang.Integer
//type[2] = java.lang.String
check {
    Integer i, String s -> //.. 仍然什么也不做
}